<?php
/**
 * Classe que usa o padrão Data Access Object para criar, ler, atualizar e deletar no banco de dados objetos do tipo Endereco
 * @name EnderecoDAO
 * @author Fabio Cezar Baía baiacfabio@gmail.com
 * @since 26/04/2013 20:40:02
 */
class EnderecoDAO extends DAO{
		
		
	/**
	 * Persiste um novo Endereco no banco de dados ou atualiza caso ja exista
	 * @access public
     * @name save
	 * @param Endereco $endereco
	 * @since 26/04/2013 20:40:10
	 */
	public function save( Endereco $endereco ) {		
		
		if($endereco->getId() == ""){			
			$this->insert($endereco);		
		}else{
			$this->update($endereco);		
		}
		
		return $this->lastId;
				
	}
	
	/**
	* Insere um novo Endereco no banco de dados
	* @access private
	* @name insert
	* @param Endereco $endereco
	* @since 26/04/2013 20:40:22
	* @return int Id do endereco inserido
	*/
	private function insert(Endereco $endereco) {
		$this->db->beginTransaction();
		try{
			$stmt = $this->db->prepare("INSERT INTO `{$this->entity}` (participante_id, tipoLogradouro, logradouro, numero, complemento, bairro, cidade, estado, pais, cep, dataModificacao) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
			$stmt->bindValue(1, $endereco->getParticipante()->getId() );
			$stmt->bindValue(2, $endereco->getTipoLogradouro() );
			$stmt->bindValue(3, $endereco->getLogradouro() );
			$stmt->bindValue(4, $endereco->getNumero() );
			$stmt->bindValue(5, $endereco->getComplemento() );
			$stmt->bindValue(6, $endereco->getBairro() );
			$stmt->bindValue(7, $endereco->getCidade() );
			$stmt->bindValue(8, $endereco->getEstado() );
			$stmt->bindValue(9, $endereco->getPais() );
			$stmt->bindValue(10, $endereco->getCEP() );
			$stmt->bindValue(11, $endereco->getDataModificacao()->format("Y-m-d H:i:s") );
			
			$stmt->execute();
			
			$this->lastId = $this->db->lastInsertId();
			
			$this->db->commit();
			
			//SystemMessage::createMessage("Endereco cadastrado com sucesso! O novo endereco receberá os dados de acesso no email cadastrado.", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			
			$this->db->rollBack();
			
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
		
		return $this->lastId;
	}
	
	/**
	* Atualiza um Endereco no banco de dados
	* @access private
	* @name update
	* @param Endereco $endereco
	* @since 23/04/2013 22:46:59
	*/
	private function update(Endereco $endereco) {

		try{
			//INSERT INTO `{$this->entity}` (participante_id, tipoLogradouro, logradouro, numero, complemento, bairro, cidade, estado, pais, cep, dataModificacao) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
			$stmt = $this->db->prepare("UPDATE `{$this->entity}` set participante_id = ?, tipoLogradouro = ?, logradouro = ?, numero = ?, complemento = ?, bairro = ?, cidade = ?, estado = ?, pais = ?, cep = ?, dataModificacao = ? WHERE id = ?");
			$stmt->bindValue(1, $endereco->getParticipante()->getId() );
			$stmt->bindValue(2, $endereco->getTipoLogradouro() );
			$stmt->bindValue(3, $endereco->getLogradouro() );
			$stmt->bindValue(4, $endereco->getNumero() );
			$stmt->bindValue(5, $endereco->getComplemento() );
			$stmt->bindValue(6, $endereco->getBairro() );
			$stmt->bindValue(7, $endereco->getCidade() );
			$stmt->bindValue(8, $endereco->getEstado() );
			$stmt->bindValue(9, $endereco->getPais() );
			$stmt->bindValue(10, $endereco->getCEP() );
			$stmt->bindValue(11, $endereco->getDataModificacao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(12, $endereco->getId() );			
			
			//SystemMessage::createMessage("Endereco atualizado com sucesso!", SystemMessage::TYPE_SUCCESS);			
			
			$stmt->execute();
			// fecho a conexão
			$this->db = null;
			
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
		
	}
	
	/**
	* Obtem um Endereco do banco com base no id
	* @access public
	* @name get
	* @param int $id Id do Endereco a ser obtido
	* @since 29/04/2013 03:10:27
	* @return Endereco
	*/
	public function get($id) {
		$endereco = new Endereco();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			$obj = $stmt->fetchObject();
			$endereco->setId($obj->id);
			
			$participanteDAO = new ParticipanteDAO();
			$endereco->setParticipante($participanteDAO->get($obj->participante_id));			
			
			$endereco->setTipoLogradouto($obj->tipoLogradouro);
			$endereco->setLogradouro($obj->logradouro);
			$endereco->setNumero($obj->numero);
			$endereco->setComplemento($obj->complemento);
			$endereco->setBairro($obj->bairro);
			$endereco->setCidade($obj->cidade);
			$endereco->setEstado($obj->estado);
			$endereco->setPais($obj->pais);
			$endereco->setCEP($obj->cep);
			$endereco->setDataModificacao($obj->dataModificacao);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}		
		
		return $endereco;
	}
	
	/**
	* Lista todos os Enderecos do banco
	* @access public
	* @name listAll
	* @since 24/04/2013 01:13:22
	* @return array Array de Enderecos
	*/
	public function listAll() {
		$lista = array();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}`");
			$stmt->execute();
			
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				$endereco = new Endereco();
				$endereco->setId($obj->id);
			
				$participanteDAO = new ParticipanteDAO();
				$endereco->setParticipante($participanteDAO->get($obj->participante_id));			
				
				$endereco->setTipoLogradouto($obj->tipoLogradouro);
				$endereco->setLogradouro($obj->logradouro);
				$endereco->setNumero($obj->numero);
				$endereco->setComplemento($obj->complemento);
				$endereco->setBairro($obj->bairro);
				$endereco->setCidade($obj->cidade);
				$endereco->setEstado($obj->estado);
				$endereco->setPais($obj->pais);
				$endereco->setCEP($obj->cep);
				$endereco->setDataModificacao($obj->dataModificacao);
				
				$lista[] = $endereco;
			}			
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
		
		return $lista;
	}
	
	/**
	 * Lista todos os Enderecos do banco pertencentes a um participante
	 * @access public
	 * @name listByParticipanteId
	 * @since 18/06/2013 22:34:54
	 * @return array Array de Enderecos
	 */
	public function listByParticipanteId($participanteId) {
		$lista = array();
	
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE participante_id ='".$participanteId."'");
			$stmt->execute();
				
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				$endereco = new Endereco();
				$endereco->setId($obj->id);
					
				$participanteDAO = new ParticipanteDAO();
				$endereco->setParticipante($participanteDAO->get($obj->participante_id));
	
				$endereco->setTipoLogradouto($obj->tipoLogradouro);
				$endereco->setLogradouro($obj->logradouro);
				$endereco->setNumero($obj->numero);
				$endereco->setComplemento($obj->complemento);
				$endereco->setBairro($obj->bairro);
				$endereco->setCidade($obj->cidade);
				$endereco->setEstado($obj->estado);
				$endereco->setPais($obj->pais);
				$endereco->setCEP($obj->cep);
				$endereco->setDataModificacao($obj->dataModificacao);
	
				$lista[] = $endereco;
			}
				
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
	
		return $lista;
	}
	
	
	/**
	* Remove um Endereco do banco com base no id
	* @access public
	* @name delete
	* @param int $id Id do Endereco a ser deletado
	* @since 24/04/2013 02:30:04
	*/
	public function delete($id) {
		try{
			$stmt = $this->db->prepare("DELETE FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			//SystemMessage::createMessage("Endereco removido com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
				
	}

}


